﻿#pragma once
#include "CWndProcess.h"
#include "CWndAddClass.h"
#include "CObjContext.h"
#include "CWndEditMContext.h"
#include "CWndAddFunc.h"

// CWndRAN 对话框

class CWndRAN : public CDialogEx
{
	DECLARE_DYNAMIC(CWndRAN)

public:
	CWndRAN(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CWndRAN();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_RAN };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
	//获取当前CObjContext指针
	CObjContext* GetObjPtr(HTREEITEM h);
	//向tree中添加条目,并且绑定关联数据:右键菜单索引,关联对象
	HTREEITEM InsertItemEx(const wchar_t* wcsTxt, DWORD dwMenuId, LPVOID lpData, HTREEITEM hTreeItem = TVI_ROOT);
	//删除条目,同时释放内存
	void DeleteItemEx(HTREEITEM hTreeItem);
	HTREEITEM GetFirstItem(HTREEITEM hTreeItem);
	//向tree中添加obj
	HTREEITEM AddObjTree(CObjContext* obj);
	//更新obj的tree
	void SetObjTree(HTREEITEM _h, CObjContext* obj);
	HTREEITEM GetSonItem(HTREEITEM h, int index);


	CWndProcess wndProcess;
	CWndAddClass wndAddClass;//用于添加类对象的窗口
	CWndEditMContext wndEditMContext;//用于编辑内存上下文的窗口
	CWndAddFunc wndAddFunc;//用于添加函数的窗口欧
	CTreeCtrl mTree;//tree控件
	CString m_wAnlyPath{};//分析需要的所有配置文件所在目录路径 RAN
	CString m_wAnlyData{};//每个游戏单独的配置文件目录 
	CListCtrl m_lstData;//list控件,显示内存信息上下文

	DECLARE_MESSAGE_MAP()
	
public:
	virtual BOOL OnInitDialog();
	//设置配置文件目录
	void SetPath(CString& path);
	//设置对象内存上下文显示
	void ShowMemContext();


	HANDLE hProcess{};//要分析的进程的句柄
	CObjContext* m_CurObj{};//当前点选的对象



	//弹出右键菜单
	afx_msg void OnNMRClickTree1(NMHDR* pNMHDR, LRESULT* pResult);
	//右键菜单 加载
	afx_msg void OnLoadGame();
	//右键菜单 添加对象
	afx_msg void OnAddClass();
	//右键菜单 删除对象
	afx_msg void OnDeleteClass();
	//右键菜单 配置对象
	afx_msg void OnSetClass();
	//右键菜单 分析对象 显示到内存上下文窗口
	afx_msg void OnAnlyClass();
	//条目颜色
	afx_msg void OnNMCustomdrawDataList(NMHDR* pNMHDR, LRESULT* pResult);
	//内存上下文窗口中 弹出右键菜单
	afx_msg void OnNMRClickDataList(NMHDR* pNMHDR, LRESULT* pResult);
	//右键菜单 推测为unicode
	afx_msg void OnSetGIDUNICODE();
	//右键菜单 推测为ascii
	afx_msg void OnSetGIDASCII();
	//右键菜单 推测为8字节
	afx_msg void OnSetGID8();
	//右键菜单 推测为4字节
	afx_msg void OnSetGID4();
	//右键菜单 推测为2字节
	afx_msg void OnSetGID2();
	//右键菜单 推测为1字节
	afx_msg void OnSetGID1();
	//右键菜单 推测为指针
	afx_msg void OnSetGIDP();
	//双击 弹出 内存上下文编辑窗口
	afx_msg void OnNMDblclkDataList(NMHDR* pNMHDR, LRESULT* pResult);
	//右键菜单 导出代码
	afx_msg void OnSaveOBJ();
	//右键菜单 添加函数
	afx_msg void OnAddFunc();
};
